from django.contrib.sessions.backends.db import SessionStore as DjangoSessionStore
from django.conf import settings
from django.contrib.auth import login as auth_login, logout as auth_logout
from django.utils.http import http_date
from django.utils.timezone import now
from django.middleware.csrf import rotate_token
import time

class AdminSessionStore(DjangoSessionStore):
    """管理员专用会话存储"""
    
    def __init__(self, session_key=None):
        super().__init__(session_key)
        # 修改会话Cookie名称
        self.session_cookie_name = getattr(settings, 'ADMIN_SESSION_COOKIE_NAME', 'admin_sessionid')
        
    def save(self, must_create=False):
        """保存会话并设置过期时间"""
        super().save(must_create)
        # 设置管理员会话过期时间
        self.set_expiry(getattr(settings, 'ADMIN_SESSION_COOKIE_AGE', 43200))  # 默认12小时

def admin_login(request, user, backend=None):
    """管理员登录函数，使用独立的会话"""
    # 如果已经在客户端登录了其他账号，先保存CSRF令牌
    csrf_token = None
    if hasattr(request, 'META') and 'CSRF_COOKIE' in request.META:
        csrf_token = request.META['CSRF_COOKIE']
    
    # 创建一个新的管理员会话存储
    admin_store = AdminSessionStore()
    admin_store.create()
    
    # 准备会话，模拟django.contrib.auth的login函数
    if hasattr(request, 'user'):
        request.user = user
    
    # 先保存原始会话
    original_session = request.session
    
    # 替换为管理员会话
    request.session = admin_store
    
    # 如果有CSRF令牌，将其复制到新会话
    if csrf_token:
        request.META['CSRF_COOKIE'] = csrf_token
        # 强制刷新 CSRF 令牌
        rotate_token(request)
    
    # 使用Django的login函数完成登录
    auth_login(request, user, backend)
    
    # 设置管理员会话Cookie
    cookie_name = getattr(settings, 'ADMIN_SESSION_COOKIE_NAME', 'admin_sessionid')
    max_age = getattr(settings, 'ADMIN_SESSION_COOKIE_AGE', 43200)
    expires_time = time.time() + max_age
    expires = http_date(expires_time)
    
    # 返回会话信息，用于设置会话Cookie
    return {
        'name': cookie_name,
        'value': admin_store.session_key,
        'max_age': max_age,
        'expires': expires,
        'path': '/',
        'domain': None,
        'secure': getattr(settings, 'SESSION_COOKIE_SECURE', False),
        'httponly': getattr(settings, 'SESSION_COOKIE_HTTPONLY', True),
        'samesite': getattr(settings, 'SESSION_COOKIE_SAMESITE', 'Lax'),
    }

def admin_logout(request):
    """管理员注销函数，清除管理员会话"""
    # 检查是否使用的是管理员会话
    cookie_name = getattr(settings, 'ADMIN_SESSION_COOKIE_NAME', 'admin_sessionid')
    session_key = request.COOKIES.get(cookie_name)
    
    if session_key:
        # 使用管理员会话存储来删除会话
        admin_store = AdminSessionStore(session_key)
        admin_store.delete()
        
        # 设置要删除的Cookie信息
        return {
            'name': cookie_name,
            'path': '/',
            'domain': None,
            'max_age': 0,
            'expires': http_date(0),
        }
    
    return None 